#include "StdAfx.h"
#include "constantes.h"
#include "helpers.h"

using std::string;
using std::stringstream;
using std::ostringstream;

//----------------------------------------------------------------------------------------

void ToString(string& out, int value)
{
    ostringstream ss;
    ss << value;
    out = ss.str();
}


//----------------------------------------------------------------------------------------

void ToString(string& out, float value)
{
    ostringstream ss;
    ss << value;
    out = ss.str();
}

//----------------------------------------------------------------------------------------

std::string GenerarNombre(int numero) {
	std::string name;
	ToString(name, numero);
	name = "def-"+ name;

	return name;
}


//----------------------------------------------------------------------------------------

int GetZone(double x, double y)
{
	if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > LIMITE_INFERIOR_CAMPO) && (y < AREA_GRANDE_LINEA_INFERIOR))
			return 1;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > LIMITE_INFERIOR_CAMPO) && (y < AREA_GRANDE_LINEA_INFERIOR))
			return 2;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > LIMITE_INFERIOR_CAMPO) && (y < AREA_GRANDE_LINEA_INFERIOR))
			return 3;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > LIMITE_INFERIOR_CAMPO) && (y < AREA_GRANDE_LINEA_INFERIOR))
			return 4;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > LIMITE_INFERIOR_CAMPO) && (y < AREA_GRANDE_LINEA_INFERIOR))
			return 5;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > LIMITE_INFERIOR_CAMPO) && (y < AREA_GRANDE_LINEA_INFERIOR))
			return 6;
	else if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > AREA_GRANDE_LINEA_INFERIOR) && (y < AREA_CHICA_LINEA_INFERIOR))
			return 7;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > AREA_GRANDE_LINEA_INFERIOR) && (y < AREA_CHICA_LINEA_INFERIOR))
			return 8;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > AREA_GRANDE_LINEA_INFERIOR) && (y < AREA_CHICA_LINEA_INFERIOR))
			return 9;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > AREA_GRANDE_LINEA_INFERIOR) && (y < AREA_CHICA_LINEA_INFERIOR))
			return 10;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > AREA_GRANDE_LINEA_INFERIOR) && (y < AREA_CHICA_LINEA_INFERIOR))
			return 11;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > AREA_GRANDE_LINEA_INFERIOR) && (y < AREA_CHICA_LINEA_INFERIOR))
			return 12;
	else if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > AREA_CHICA_LINEA_INFERIOR) && (y < ARCO_LINEA_INFERIOR))
			return 13;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > AREA_CHICA_LINEA_INFERIOR) && (y < ARCO_LINEA_INFERIOR))
			return 14;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > AREA_CHICA_LINEA_INFERIOR) && (y < ARCO_LINEA_INFERIOR))
			return 15;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > AREA_CHICA_LINEA_INFERIOR) && (y < ARCO_LINEA_INFERIOR))
			return 16;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > AREA_CHICA_LINEA_INFERIOR) && (y < ARCO_LINEA_INFERIOR))
			return 17;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > AREA_CHICA_LINEA_INFERIOR) && (y < ARCO_LINEA_INFERIOR))
			return 18;
	else if ((x > ARCO_LINEA_DE_ATRAS_IZQUIERDA) && (x < LIMITE_IZQUIERDO_CAMPO) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 19;
	else if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 20;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 21;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 22;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 23;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 24;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 25;
	else if ((x > LIMITE_DERECHO_CAMPO) && (x < ARCO_LINEA_DE_ATRAS_DERECHA) &&
		(y > ARCO_LINEA_INFERIOR) && (y < MITAD_DE_CANCHA_EN_Y))
			return 26;
	else if ((x > ARCO_LINEA_DE_ATRAS_IZQUIERDA) && (x < LIMITE_IZQUIERDO_CAMPO) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 27;
	else if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 28;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 29;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 30;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 31;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 32;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 33;
	else if ((x > LIMITE_DERECHO_CAMPO) && (x < ARCO_LINEA_DE_ATRAS_DERECHA) &&
		(y > MITAD_DE_CANCHA_EN_Y) && (y < ARCO_LINEA_SUPERIOR))
			return 34;
	else if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > ARCO_LINEA_SUPERIOR) && (y < AREA_CHICA_LINEA_SUPERIOR))
			return 35;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > ARCO_LINEA_SUPERIOR) && (y < AREA_CHICA_LINEA_SUPERIOR))
			return 36;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > ARCO_LINEA_SUPERIOR) && (y < AREA_CHICA_LINEA_SUPERIOR))
			return 37;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > ARCO_LINEA_SUPERIOR) && (y < AREA_CHICA_LINEA_SUPERIOR))
			return 38;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > ARCO_LINEA_SUPERIOR) && (y < AREA_CHICA_LINEA_SUPERIOR))
			return 39;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > ARCO_LINEA_SUPERIOR) && (y < AREA_CHICA_LINEA_SUPERIOR))
			return 40;
	else if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > AREA_CHICA_LINEA_SUPERIOR) && (y < AREA_GRANDE_LINEA_SUPERIOR))
			return 41;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > AREA_CHICA_LINEA_SUPERIOR) && (y < AREA_GRANDE_LINEA_SUPERIOR))
			return 42;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > AREA_CHICA_LINEA_SUPERIOR) && (y < AREA_GRANDE_LINEA_SUPERIOR))
			return 43;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > AREA_CHICA_LINEA_SUPERIOR) && (y < AREA_GRANDE_LINEA_SUPERIOR))
			return 44;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > AREA_CHICA_LINEA_SUPERIOR) && (y < AREA_GRANDE_LINEA_SUPERIOR))
			return 45;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > AREA_CHICA_LINEA_SUPERIOR) && (y < AREA_GRANDE_LINEA_SUPERIOR))
			return 46;
	else if ((x > LIMITE_IZQUIERDO_CAMPO) && (x < AREA_CHICA_LINEA_IZQUIERDA) &&
		(y > AREA_GRANDE_LINEA_SUPERIOR) && (y < LIMITE_SUPERIOR_CAMPO))
			return 47;
	else if ((x > AREA_CHICA_LINEA_IZQUIERDA) && (x < AREA_GRANDE_LINEA_IZQUIERDA) &&
		(y > AREA_GRANDE_LINEA_SUPERIOR) && (y < LIMITE_SUPERIOR_CAMPO))
			return 48;
	else if ((x > AREA_GRANDE_LINEA_IZQUIERDA) && (x < MITAD_DE_CANCHA_EN_X) &&
		(y > AREA_GRANDE_LINEA_SUPERIOR) && (y < LIMITE_SUPERIOR_CAMPO))
			return 49;
	else if ((x > MITAD_DE_CANCHA_EN_X) && (x < AREA_GRANDE_LINEA_DERECHA) &&
		(y > AREA_GRANDE_LINEA_SUPERIOR) && (y < LIMITE_SUPERIOR_CAMPO))
			return 50;
	else if ((x > AREA_GRANDE_LINEA_DERECHA) && (x < AREA_CHICA_LINEA_DERECHA) &&
		(y > AREA_GRANDE_LINEA_SUPERIOR) && (y < LIMITE_SUPERIOR_CAMPO))
			return 51;
	else if ((x > AREA_CHICA_LINEA_DERECHA) && (x < LIMITE_DERECHO_CAMPO) &&
		(y > AREA_GRANDE_LINEA_SUPERIOR) && (y < LIMITE_SUPERIOR_CAMPO))
			return 52;
	else
		return 0;
}


//----------------------------------------------------------------------------------------

double Normalize180(double angle)
{
	double r = angle;

	while (r > 180)
		r -= 360;
	while (r < -180)
		r += 360;

	return angle;
}
//----------------------------------------------------------------------------------------

bool IsInField(bool field, double x)
{
	return (
		(x < MITAD_DE_CANCHA_EN_X - DISTANCIA_CERCA && field) ||
		(x > MITAD_DE_CANCHA_EN_X + DISTANCIA_CERCA && !field)
	);
}



//----------------------------------------------------------------------------------------

double ObtenerAngulo(double x0, double y0, double xf, double yf) {
    double dx, dy;
    // Encontra x e y
    dx = xf - x0;
    dy = yf - y0;
    // Calcula el angulo y lo convierte en grados
    return (180.0/M_PI)*atan2(dy, dx);
}

double ObtenerAngulo_viejo( double x0, double y0, double xf, double yf )
{
	double dx, dy, r, alfa;

	dx = xf-x0;
	dy = yf-y0;

	if (dx == 0 && dy == 0)
		alfa = 0;
	else
	{
		if (dx == 0)
		{
			if (dy > 0)
				alfa = 90;
			else
				alfa = -90;
		}
		else
			if (dy == 0)
			{
				if (dx > 0)
					alfa = 0;
				else
					alfa = 180;
			}
			else
			{
				// dx y dy != 0
				if (dx > 0)
					r = atan(fabs(dy) / fabs(dx));
				else
					r = atan(fabs(dx) / fabs(dy));
				alfa = Rad2Deg(r);
				if(dx < 0)
					alfa += 90;
				if (dy < 0)
					alfa *= -1;
			}
	}

	return alfa;
}


//----------------------------------------------------------------------------------------

double ObtenerDistancia(double x0, double y0, double xf, double yf)
{
	double dist_x = xf - x0;
	double dist_y = yf - y0;

	return sqrt((dist_x * dist_x) + (dist_y * dist_y));
}

//----------------------------------------------------------------------------------------
double CalcularAngulo2Pts(double xo, double yo, double xf, double yf)
{
	double dx, dy, alfa;

	dx = xf - xo;
	dy = yf - yo;

	if (dx == 0 && dy == 0) {
		alfa = 0;
	}
	else if (dx == 0) {
		if (dy > 0)
			alfa = 90;
		else
			alfa = 270;
	}
	else if (dy == 0) {
		if (dx > 0)
			alfa = 0;
		else
			alfa = 180;
	}
	else {
		alfa = atan(fabs(dy) / fabs(dx));

		alfa = Rad2Deg(alfa);

		if ((dx > 0) && (dy > 0))
			alfa = alfa;
		else if ((dx < 0) && (dy > 0))
			alfa = 180 - alfa;
		else if ((dx < 0) && (dy < 0))
			alfa = 180 + alfa;
		else
			alfa = 360 - alfa;
	}

	return alfa;
}


double NormalizarAngulo(double angulo)
{
	while (angulo >  360) angulo -= 360;
	while (angulo < -0) angulo += 360;

	return angulo;
}

double CalcularAnguloAGirar(double x0, double y0, double xf, double yf, double rr)
{
	double Ang2Puntos = CalcularAngulo2Pts(x0, y0, xf, yf);
	double AngAGirar = Ang2Puntos - NormalizarAngulo(rr);

	return Deg2Rad(AngAGirar);
}

bool EstaDeNuestroLadoLaPelota(int colorTeam, double posXBall)
{
	/*return (
		(x < MITAD_DE_CANCHA_EN_X - DISTANCIA_CERCA && field) ||
		(x > MITAD_DE_CANCHA_EN_X + DISTANCIA_CERCA && !field)
	);*/
	if(posXBall < MITAD_DE_CANCHA_EN_X && colorTeam == YELLOW_BALL)
		return true;
	if(posXBall < MITAD_DE_CANCHA_EN_X && colorTeam == BLUE_BALL)
		return false;
    if(posXBall > MITAD_DE_CANCHA_EN_X && colorTeam == BLUE_BALL)
		return true;
	if(posXBall > MITAD_DE_CANCHA_EN_X && colorTeam == YELLOW_BALL)
		return false;

	return false;	//	Para eliminar el warning.
}
